Hive常用字符串函数(工作中总结整理) |
您所在的位置:网站首页 › hive string函数 › Hive常用字符串函数(工作中总结整理) |
【"Hive内置聚合函数"】https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inAggregateFunctions(UDAF) substrsubstr(string A, int start), 返回字符串A从start位置到结尾的字符串 substr(string A, int start, int len),返回字符串A从start位置开始,长度为len的字符串 substringsubstring(string A, int start), 返回字符串A从start位置到结尾的字符串 substring(string A, intstart, int len),返回字符串A从start位置开始,长度为len的字符串 concat使用concat()函数将字符串和字符串连接起来 eg: user表中phone为13578787878,需处理成1357878; hive > SELECT concat(substr(phone,1,3),',',substr(phone,8)) AS phone FROM user hive > 135****7878seq1 seq2 11111 CC0000 11111 CC1111 11111 CC2222 22222 CC3333 22222 CC4444 collect_setcollect_set 是 Hive 内置的一个聚合函数, 它返回一个消除了重复元素的对象集合, 其返回值类型是 array 。 将上面表中一个seq1可能会占用多行转换为每个seq1占一行的目标表格式,实际是“列转行”。 hive > select seq1,collect_set(seq2) from tab1 group by seq1seq1 seq2 11111 ["CC0000","CC1111","CC2222"] 22222 ["CC3333","CC4444"] hive > select seq1,SIZE(collect_set(seq2)) from tab1 group by seq1 hive > 22222 2 hive > 11111 3concat_ws hive > select seq1,concat_ws(',',collect_set(seq2)) from tab1 group by seq1 seq1 seq211111 CC0000,CC1111,CC222222222 CC3333,CC4444 collect_set的作用: (1)去重,对group by后面的seq1进行去重 (2)对group by以后属于同一seq1的形成一个集合,结合concat_ws对集合中元素使用,进行分隔形成字符串 eg: UserOrder表中user, order_type, order_number三列,需处理成行如: user1 order_type1(order_number1),order_type2(order_number2)一行数据 hive > select user,concat_ws(',',collect_set(concat(order_type,'(',order_number,')'))) items from UserOrder group by userexplode explode()接受一个数组(或一个map)作为输入,并将数组元素(map)作为单独的行输出。 UDTF可以在SELECT表达式列表中使用,也可以作为LATERAL VIEW的一部分使用。 数据格式如下: Array myCol [100,200,300] [400,500,600] hive > SELECT explode(myCol) AS myNewCol FROM myTable;
结果如下: (int)myNewCol 100 200 300 400 500 600 Map和array类似 hive >SELECT explode(myMap) AS (myMapKey, myMapValue) FROM myMapTable;LATERAL VIEW Lateral View用于UDTF(user-defined table generating functions)中将行转成列,Lateral View与explode等udtf就是天生好搭档,explode将复杂结构一行拆成多行,然后再用Lateral View做各种聚合。 现有基础表pageAds(表结构如下): Column_name Column_name pageid String add_list Array 数据格式如下: pageid add_list front_page [1,2,3] contact_page [3,4,5] 并且用户希望计算广告在所有页面中显示的总次数。 使用lateral view explode()可以使用查询将adid_list转换为单独的行(记得写别名): hive >SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;结果如下: pageid(string) adid(int) front_page 1front_page 2front_page 3contact_page 3contact_page 4contact_page 5为了统计每个页面的数量,需要对adid进行group by分组,然后count hive >SELECT adid, count(1) FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid GROUP BY adid;
结果如下: int adid count(1) 1 1 2 1 3 2 4 1 5 1 但有些情况下,需要自己用split函数将拼接的字符串转换为分割array数组类型 hive >SELECT bb FROM user as aa lateral view explode(split(concat_ws(',',id,userid,phone),',') )b as bblength length(String A) 返回值:int hive > SELECT length('abcdefg') from tab 7 解析json现有表test中字段data如下json格式: {"store":{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"} 1.get_json_object(string json_string, string path)用来解析json字符串中的一个字段 说明:解析json的字符串json_string,返回path指定的内容。若json字符串无效,则返回NULL。 get单层值 hive > select get_json_object(data, '$.owner') from test; amy1 get多层值 hive > select get_json_object(data, '$.store.bicycle.price') from test; 19.951 get数组值[] hive > select get_json_object(data, '$.store.fruit[0]') from test; {"weight":8,"type":"apple"} get多个字段 hive > SELECT get_json_object(data,'$.owner') as owner,get_json_object(data,'$.fruit[0].type')as type FROM test 2.json_tuple(jsonStr, k1, k2, ...)用来解析json字符串中的多个字段 使用json_tuple对象时,可以一次获取多个对象并且可以被组合使用 hive > SELECT aa.owner,aa.email FROM test lateral view json_tuple(data,'owner','email')aa AS owner,email
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |